package com.yutian.springbootwebflux.config;

import freemarker.template.utility.XmlEscape;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.reactive.config.ResourceHandlerRegistry;
import org.springframework.web.reactive.config.ViewResolverRegistry;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import org.springframework.web.reactive.result.view.freemarker.FreeMarkerConfigurer;

import java.util.HashMap;
import java.util.Map;

// 不需要@EnableWebFlux，也不要加，否则其它restful接口报错404
@Configuration
public class CustomWebFluxConfigurer implements WebFluxConfigurer {


    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        Map<String, Object> variables = new HashMap<>();
        // 全局变量
        variables.put("from", "FreeMarker");
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setTemplateLoaderPath("classpath:/templates");
        configurer.setFreemarkerVariables(variables);
        return configurer;
    }

    /**
     * 加入视图解析器，不然找不到view name
     * @param registry
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.freeMarker();
    }

    /**
     * Spring Boot 默认从类路径的以下目录（/static、 /public 、/resources 、/META-INF/resources）加载静态资源，当然，你可以自定义配置类实现 WebFluxConfigurer 并重写 addResourceHandlers 方法来修改默认资源路径：
     * Spring Boot 默认将静态资源映射在 /** 的路径下，当然，你可以通过修改 spring.webflux.static-path-pattern 属性来调整默认映射，例如，将所有资源映射到 /resources/** 路径 ，可以通过以下方式实现：
     *
     * spring.webflux.static-path-pattern=/resources/**
     * 你也可以通过设置 spring.resources.static-locations 属性值来自定义资源目录，如果你这样做了，默认的欢迎页面检测也将会切换到你设置的资源目录。因此，在你的资源目录中，只要有一个 index.html 页面，都将会成为你的应用主页。
     *
     * 除了前面介绍的标准静态资源外，还有一种特殊的情况，那就是 webjars 内容。如果静态资源被打包成了 webjars 的格式，那么访问这些资源的路径就变成了 /webjars/** 。
     *
     * tips：Spring WebFlux 应用程序不严格依赖 Servlet API，因此不能将它们部署为 war 文件，也不使用 src/main/webapp 目录。
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // do more, 以下是默认配置，可省略
        registry.addResourceHandler("/static/**")
                //指向的是目录
                .addResourceLocations("classpath:/static/");

    }
}